# 函数的多返回值
# 演示使用多个变量，接收多个返回值
def test_return():
    return 1,"hello",True
x,y,z = test_return()
print(f"x = {x}")
print(f"y = {y}")
print(f"z = {z}")


# 函数的多种参数使用形式
# 位置参数:调用函数时根据的定义的参数位置来传递参数——传递的参数和定义的参数的顺序及个数必须一致
# 位置参数演示
def user_info(name,age,gender):
    print(f"姓名:{name}\n年龄:{age}\n性别:{gender}\n")
user_info("tom",20,"man")

# 关键字参数:函数调用时通过"键 = 值"形式传递参数
# 作用:可以让函数更加清晰、容易使用，同时也清楚了参数的顺序需求
# 注意:函数调用时，如果有位置参数时，位置参数必须在关键字参数的前面，但关键字参数之间不存在先后顺序
# 关键字参数演示
user_info(name="小明",gender="man",age=25)
# 关键字参数和位置参数同时存在演示
user_info("小白",age=18,gender="woman")

# 缺省参数——默认参数:定义函数时，为参数提供默认值，函数调用时可不传该默认参数的值
# 注意:所有默认参数必须出现在默认参数前，包括函数定义和调用
# 作用:函数调用时没有传递参数就会使用默认使用缺省参数对应的值
# 缺省参数演示
def user_info(name,age,gender = "男"):
    print(f"姓名:{name}\n年龄:{age}\n性别:{gender}\n")
user_info("jack",25)

# 不定长参数:可变参数，用于不确定调用的时候会传递多少个参数
# 作用:当调用函数时不确定参数个数时，可以使用不定长参数
# 不定长参数的类型:位置参数和关键字参数
# 位置参数不定长
def user_info(*args):       # args 是一个元组类型
    print(f"{args},{type(args)}")
user_info("jack",25)
# 关键字参数不定长
def user_info(**kwargs):    # kwargs 是一个字典类型
    print(f"{kwargs},{type(kwargs)}")
user_info(name="tom",age=18)


# 匿名函数
# 函数作为参数传递
def test_func(add):    # 传入的是逻辑，计算数据是确定的，计算的逻辑是不确定的
    return add(5,2)
def add(x,y):
    return x + y
num = test_func(add)
print(num)

# lambda 匿名函数——无名称，只可以临时使用一次
# 语法: lambda 传入参数:函数体(一行代码)
def test_func(add):
    return add(5,2)
num = test_func(lambda x,y:x+y)
print(num)


